#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct data
{
    int T;
    char *position;
} data;


// 重新分配内存的函数
// 参数:
//   ptr: 要重新分配内存的指针
//   new_size: 新的内存大小（以元素数为单位）
//   old_size: 原始内存大小（以元素数为单位）
// 返回值:
//   成功时返回重新分配后的指针，失败时返回NULL
data *my_realloc(data *ptr, size_t new_size, size_t old_size)
{
    if (new_size == 0)
    {
        free(ptr);
        return NULL;
    }

    // 检查新大小是否小于原始大小，这种情况下不做任何操作
    if(new_size<old_size)
    {
        return NULL;
    }

    // 分配新的内存空间
    data *new_ptr = (data *)malloc(new_size * sizeof(data));

    if (new_ptr == NULL)
    {
        return NULL;
    }

    // 计算需要复制的字节数，确保不超出原始大小
    size_t copy_size = (new_size < old_size) ? new_size : old_size;

    /*
    void *memcpy(void *dest, const void *src, size_t n);

    它的参数含义如下：

    dest：目标内存的起始地址，即数据将要被复制到的位置。

    src：源内存的起始地址，即要复制的数据的来源。

    n：要复制的字节数。
    */

    // 复制数据到新的内存空间
    memcpy(new_ptr, ptr, copy_size);

    free(ptr);
    return new_ptr;
}

int main()
{
    data *p = (data *)malloc(sizeof(data) * 5);

    data D[5] =
        {
            {.T = 32, .position = "常德"},
            {.T = 34, .position = "长沙"},
            {.T = 32, .position = "武汉"},
            {.T = 30, .position = "北京"},
            {.T = 32, .position = "天津"}};

     // 将数据复制到初始内存空间
    for (size_t i = 0; i < 5; i++)
    {
        p[i] = D[i];
    }

    data *new_p = my_realloc(p, sizeof(data) * 10, sizeof(data) * 5);

    // 检查内存重新分配是否成功
    if (new_p == NULL)
    {
        printf("内存重新分配失败\n");
        free(p); // 如果失败了，记得释放原来的内存
        return 1;
    }

    // 打印重新分配后的数据
    for (size_t i = 0; i < 10; i++)
    {
        printf("温度:%d\t地区:%s\n", new_p[i].T, new_p[i].position);
    }

    // 释放重新分配后的内存
    free(new_p);
    return 0;
}